#include "Ink_syslim.h"
#include <assert.h>
#include <stdio.h>

int get_fd_limit(struct rlimit *lim)
{
	assert(lim != NULL);
	if(getrlimit(RLIMIT_NOFILE, lim) != 0)
	{
		return errno;
	}

	return 0;
}

int set_fd_limit(int fd_throttle)
{
	struct rlimit lim;
	int err = 0;
	if((err = get_fd_limit(&lim)) != 0)
	{
		return err;	
	}

	//setting
	//after setrlimit, we should call getrlimt check
	if(lim.rlim_cur < fd_throttle)
	{
		lim.rlim_cur = lim.rlim_max = fd_throttle;
		if(setrlimit(RLIMIT_NOFILE, &lim) != 0)
		{
			return errno;
		}

		if((err = get_fd_limit(&lim)) != 0)
		{
			return err;
		}

		if(lim.rlim_cur != fd_throttle)
		{
			assert(!"set fd limt error");
		}
	}

	return 0;
}

int set_core_size(uint64_t size)
{
	struct rlimit lim;
	if(size < 0)
	{
		lim.rlim_cur = lim.rlim_max;
	}else{
		lim.rlim_cur = (rlim_t) size;
	}

	if(setrlimit(RLIMIT_CORE, &lim) < 0)
	{
		return errno;
	}

	return 0;
}
